package wortubung.lang.it;

import static wortubung.util.CommonUtils.*;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import wortubung.util.ImmutableStringList;

// http://en.wikipedia.org/wiki/Italian_verbs
public class ConiugatoreUtil {

	// -are/ere => -er*; -ire => -ir*
	static final ImmutableStringList FUTURO_INDICES       = isl("ò",  "ai",   "à",    "emo",  "ete",  "anno"  );
	static final ImmutableStringList CONDIZIONALE_INDICES = isl("ei", "esti", "ebbe", "emmo", "este", "ebbero");

	// -are, -ere, -ire, -ire(-isc); same below.
	static final ImmutableStringList[] PRESENTE_INDICES = {
		isl("o",    "i",    "a",    "iamo", "ate", "ano"),		// -are, -arsi
		isl("o",    "i",    "e",    "iamo", "ete", "ono"),		// -ere, -ersi
		isl("o",    "i",    "e",    "iamo", "ite", "ono"),		// -ire, -irsi
		isl("isco", "isci", "isce", "iamo", "ite", "iscono"),	// -ire, -irsi: -isc stem changes.
	};

	// -are/ere/ire => *
	static final ImmutableStringList[] IMPERATIVO_INDICES = {
		isl(null, "a",    "i",    "iamo", "ate", "ino"),
		isl(null, "i",    "a",    "iamo", "ete", "ano"),
		isl(null, "i",    "a",    "iamo", "ite", "ano"),
		isl(null, "isci", "isca", "iamo", "ite", "iscano"), // -isc
	};

	// -are/ere/ire => *
	static final ImmutableStringList[] IMPERFECTO_INDICES = {
		isl("avo", "avi", "ava", "avamo", "avate", "avano"),
		isl("evo", "evi", "eva", "evamo", "evate", "evano"),
		isl("ivo", "ivi", "iva", "ivamo", "ivate", "ivano"),
		null,
	};

	// -are/ere/ire => *
	static final ImmutableStringList[] PASSATO_REMOTO = {
		isl("ai",        "asti", "ò",        "ammo", "aste", "arono" ),
		isl("(ei/etti)", "esti", "(é/ette)", "emmo", "este", "(erono/ettero)" ),
		isl("ii",        "isti", "ì",        "immo", "iste", "irono" ),
		null,
	};

	// -are/ere/ire => *
	static final ImmutableStringList[] CONGIUNTIVO_PRESENTE_INDICES = {
		isl("i",    "i",    "i",    "iamo", "iate", "ino"),
		isl("a",    "a",    "a",    "iamo", "iate", "ano"),
		isl("a",    "a",    "a",    "iamo", "iate", "ano"),
		isl("isca", "isca", "isca", "iamo", "iate", "iscano"),
	};

	// -re => *
	static final ImmutableStringList CONGIUNTIVO_IMPERFETTO_INDICES =
			isl("ssi", "ssi", "sse", "ssimo", "ste", "ssero");

	static {
		IMPERFECTO_INDICES[3] = IMPERFECTO_INDICES[2];
		PASSATO_REMOTO[3] = PASSATO_REMOTO[2];
	}

	protected static Map<String,String> irregularPastParticiples = new HashMap<String,String>();
	protected static Set<String> iscVerbs = new HashSet<String>();

	static String[] appendToRoot(String root, int verbEnding, ImmutableStringList suffices) {
		String [] result = new String[suffices.size()];
		for (int i=0; i<suffices.size(); ++i) {
			String suffix = suffices.get(i);
			if (suffix == null)
				result[i] = null;
			else if (isEmpty(suffix))
				result[i] = root;
			else
				result[i] = phonetique(root, verbEnding, suffices.get(i));
		}
		return result;
	}

	// -care: c+i -> chi
	// -gare: g+i -> ghi
	static String phonetique(String root, int verbEnding, String suffix) {
		if (verbEnding == 0) {
			char c1 = last(root);
			char c2 = suffix.charAt(0);
			if ((c1 == 'c' || c1 == 'g') && (c2 == 'i' || c2 == 'ì' || c2 == 'e' || c2 == 'é'))
				return root + 'h' + suffix;
		}
		return root + suffix;
	}
}
